#include "threadpool.hpp"

template <class T>
Threadpool<T>::Threadpool(size_t numThread) {
	for (size_t i = 0; i < numThread; i++) {
		// 创建线程并绑定工作循环
		workers.emplace_back(&Threadpool::workerThread, this);
	}
}

template <class T>
Threadpool<T>::~Threadpool() {
	stop();
}

// template <class T>
// template <typename F, typename... Args>
// auto Threadpool<T>::enqueueTask(F&& f, Args&&... args) -> std::future<std::invoke_result_t<F, Args...>> {
// 	using ReturnType = std::invoke_result_t<F, Args...>;
// 	// 将任务封装为packaged_task以获取future
// 	auto task = std::make_shared<std::packaged_task<ReturnType()>> (
// 		std::bind(std::forward<F>(f), std::forward<Args>(args)...)
// 	);

// 	std::future<ReturnType> ans = task->get_future();
// 	{
// 		// 保证一下生命周期
// 		// 临界区保护（自动锁）
// 		std::lock_guard<std::mutex> lock(queueMutex);
// 		// 异常处理
// 		if (stop_flag) {
// 			throw std::runtime_error("Threadpool is stopped, cannot enqueue tasks.");
// 		}
		
// 		// tasks.push(task);
// 		// 添加模板类之后 插入形式也要改变
// 		// 将任务包装为void()类型入队
// 		tasks.emplace([task]() { 
// 			(*task)();		// 执行包装任务
// 		});
// 	}
// 	condition.notify_one();		// 唤醒一个等待线程
// 	return ans;
// }

// template <class T>
// template <typename F, typename... Args>
// auto Threadpool<T>::enqueueTask(F&& f, Args&&... args) -> std::future<std::invoke_result_t<F, Args...>> {
//     using ReturnType = std::invoke_result_t<F, Args...>;

//     auto task = std::make_shared<std::packaged_task<ReturnType()>>(
//         std::bind(std::forward<F>(f), std::forward<Args>(args)...)
//     );

//     std::future<ReturnType> result = task->get_future();
//     {
//         std::lock_guard<std::mutex> lock(queueMutex);
//         if (stop_flag) {
//             throw std::runtime_error("Threadpool is stopped, cannot enqueue tasks.");
//         }
//         tasks.emplace([task]() { (*task)(); });
//     }
//     condition.notify_one();
//     return result;
// }

// template <class T>
// void Threadpool<T>::stop() {
// 	{
// 		std::lock_guard<std::mutex> lock(queueMutex);
// 		stop_flag = true;
// 	}
// 	condition.notify_all();		// 唤醒所有线程
// 	for (auto& worker : workers) {
// 		worker.join();		// 等待所有线程结束 阻塞一下主线程达到等待其他线程的效果
// 	}
// }

// 工作线程主循环（核心逻辑）
template <class T>
void Threadpool<T>::workerThread() {
	while (true) {
		std::function<T()> task;
		{
			// 唯一锁支持条件变量
			std::unique_lock<std::mutex> lock(queueMutex);
			// 等待条件：有任务或停止信号 满足条件就等待
			condition.wait(lock, [this] { 
				return !tasks.emplace() || stop_flag;
			});

			// 停止条件检查
			if (stop_flag && tasks.empty()) {
				return;
			}
			// task = tasks.front();
			// 性能上将源对象直接移动 而不是copy  移动语义提升性能（避免拷贝）
			task = std::move(tasks.front());
			tasks.pop();
		}
		try {
			task();
		} catch(const std::exception& e) {
			std::cerr << "Task exception: " << e.what() << '\n';
		} catch (...) {
			std::cerr << "未知异常出现在 task 中" << std::endl;
		}
	}
}

// 模板实例化
template class Threadpool<void>;